import { ElMessage } from 'element-plus'

/**
 * 验证ID是否有效（非空、非undefined、非null）
 * @param id 要验证的ID值
 * @returns 是否为有效ID
 */
export const isValidId = (id: any): boolean => {
  if (id === null || id === undefined) return false

  const idStr = String(id).trim()
  if (idStr === '') return false

  const idNum = Number(idStr)
  return !isNaN(idNum)
}

/**
 * 验证ID是否为有效正数
 * @param id 要验证的ID值
 * @returns 是否为有效正数ID
 */
export const isValidPositiveId = (id: any): boolean => {
  if (id === null || id === undefined) return false

  const idStr = String(id).trim()
  if (idStr === '' || idStr === '0') return false

  const idNum = Number(idStr)
  return !isNaN(idNum) && idNum > 0
}

/**
 * 验证合同ID是否有效
 * @param contractId 合同ID
 * @returns 是否为有效合同ID
 */
export const isValidContractId = (contractId: any): boolean => {
  return isValidId(contractId)
}

/**
 * 验证案件ID是否有效
 * @param caseId 案件ID
 * @returns 是否为有效案件ID
 */
export const isValidCaseId = (caseId: any): boolean => {
  return isValidId(caseId)
}

/**
 * 准备API请求参数，自动将驼峰命名转换为下划线命名
 * @param params 原始参数对象
 * @returns 转换后的参数对象
 */
export const prepareApiParams = (params: Record<string, any>): Record<string, any> => {
  const result: Record<string, any> = {}

  for (const key in params) {
    if (Object.prototype.hasOwnProperty.call(params, key)) {
      // 将驼峰命名转换为下划线命名
      const snakeCaseKey = key.replace(/([A-Z])/g, '_$1').toLowerCase()
      result[snakeCaseKey] = params[key]
    }
  }

  return result
}

/**
 * 获取有效合同ID，用于API请求
 * @param contractId 合同ID（可能来自props或其他地方）
 * @param fallbackContractId 备选合同ID
 * @returns 有效合同ID或undefined
 */
export const getValidContractId = (
  contractId: any,
  fallbackContractId?: any
): number | undefined => {
  // 检查contractId是否存在且不为空字符串，允许为0
  if (contractId !== null && contractId !== undefined && String(contractId).trim() !== '') {
    const numValue = Number(contractId)

    return numValue
  }

  // 检查fallbackContractId，允许为0
  if (
    fallbackContractId !== null &&
    fallbackContractId !== undefined &&
    String(fallbackContractId).trim() !== ''
  ) {
    const numValue = Number(fallbackContractId)

    return numValue
  }

  return undefined
}

/**
 * 检查合同ID是否有效，如果无效则显示警告消息
 * @param contractId 合同ID
 * @param message 自定义警告消息
 * @returns 是否为有效合同ID
 */
export const checkContractId = (contractId: any, message: string = '请先关联合同'): boolean => {
  // 仅当需要合同ID的操作时才显示警告
  // 对于查看操作，允许contractId为空
  const isValid =
    contractId !== null && contractId !== undefined && String(contractId).trim() !== ''
  if (!isValid && message) {
    ElMessage.warning(message)
  }
  return isValid
}
